package model;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Timer;
import noname.ConfigSettings;

/**
 * Deze klasse is een implementatie van GpsStrategy en wordt
 * gebruikt door de GpsReceiver klasse.
 * Deze klasse zorgt voor een simulatie van een gebruiker
 * alsof deze de route daadwerkelijk aan het lopen is.
 * De simulatie goordinaten worden uit een bestand gelezen
 * en een timer zorgt er voor dat de coordinaten van de
 * simulatie worden afgewerkt.
 */
public class GpsSimulation extends GpsStrategy implements ActionListener {

    private List<GpsCoordinate> gpsCoordinates;
    private Timer timer;
    private int index = 0;
    
    public GpsSimulation(GpsReceiver gpsReceiver) {
        super(gpsReceiver);

        String routePath = ConfigSettings.getInstance().getRoutePath() + "simulatie_GPS_historische_route.txt";
        FileReader fr;
        try {
            fr = new FileReader(routePath);

            BufferedReader br = new BufferedReader(fr);
            String line;

            String[] strings = null;

            int LatDegrees, LatMinutes, LongDegrees, LongMinutes;
            double LatSeconds, LongSeconds;

            gpsCoordinates = new ArrayList<GpsCoordinate>();

            line = br.readLine();

            while (line != null) {
                strings = line.split(",");

                if (strings[0].equals("$GPGGA")) {
                    LatDegrees = Integer.parseInt(strings[2].substring(0, 2));
                    LatMinutes = Integer.parseInt(strings[2].substring(2, 4));
                    LatSeconds = Double.parseDouble("0" + strings[2].substring(4, 9)) * 60;

                    LongDegrees = Integer.parseInt(strings[4].substring(0, 3));
                    LongMinutes = Integer.parseInt(strings[4].substring(3, 5));
                    LongSeconds = Double.parseDouble("0" + strings[4].substring(5, 10)) * 60;

                    gpsCoordinates.add(new GpsCoordinate(new GpsLatitude(LatDegrees, LatMinutes, LatSeconds), new GpsLongitude(LongDegrees, LongMinutes, LongSeconds)));
                }

                line = br.readLine();
            }

            timer = new Timer(100, this);
            timer.start();
            
        } catch (FileNotFoundException ex) {
            Logger.getLogger(GpsSimulation.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(GpsSimulation.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        
        GpsCoordinate coord = gpsCoordinates.get(index);
        gpsReceiver.handleNewCoordinate(coord);
        index++;
        
        if (gpsCoordinates.size() == index) {
            index = 0;
        }
    }
}
